home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / phpMyAdmin / libraries / export / sql.php < prev    next >
PHP Script  |  2005-03-05  |  24KB  |  609 lines

  1. <?php
  2. /* $Id: sql.php,v 2.44 2005/03/06 12:30:10 lem9 Exp $ */
  3. // vim: expandtab sw=4 ts=4 sts=4:
  4. error_reporting(E_ALL);
  5. /**
  6.  * Set of functions used to build SQL dumps of tables
  7.  */
  8.  
  9. /**
  10.  * Marker for comments, -- is needed for ANSI SQL.
  11.  */
  12. $GLOBALS['comment_marker'] = '-- ';
  13.  
  14. /**
  15.  * Outputs comment
  16.  *
  17.  * @param   string      Text of comment
  18.  *
  19.  * @return  bool        Whether it suceeded
  20.  */
  21. function PMA_exportComment($text) {
  22.     return PMA_exportOutputHandler($GLOBALS['comment_marker'] . $text . $GLOBALS['crlf']);
  23. }
  24.  
  25. /**
  26.  * Outputs export footer
  27.  *
  28.  * @return  bool        Whether it suceeded
  29.  *
  30.  * @access  public
  31.  */
  32. function PMA_exportFooter() {
  33.     global $crlf;
  34.  
  35.     $foot = '';
  36.  
  37.     if (isset($GLOBALS['disable_fk'])) {
  38.         $foot .=  $crlf . 'SET FOREIGN_KEY_CHECKS=1;' . $crlf;
  39.     }
  40.  
  41.     if (isset($GLOBALS['use_transaction'])) {
  42.         $foot .=  $crlf . 'COMMIT;' . $crlf;
  43.     }
  44.  
  45.     return PMA_exportOutputHandler($foot);
  46. }
  47.  
  48. /**
  49.  * Outputs export header
  50.  *
  51.  * @return  bool        Whether it suceeded
  52.  *
  53.  * @access  public
  54.  */
  55. function PMA_exportHeader() {
  56.     global $crlf;
  57.     global $cfg;
  58.  
  59.     if (PMA_MYSQL_INT_VERSION >= 40100 && isset($GLOBALS['sql_compat']) && $GLOBALS['sql_compat'] != 'NONE') {
  60.         PMA_DBI_try_query('SET SQL_MODE="' . $GLOBALS['sql_compat'] . '"');
  61.     }
  62.  
  63.     $head  =  $GLOBALS['comment_marker'] . 'phpMyAdmin SQL Dump' . $crlf
  64.            .  $GLOBALS['comment_marker'] . 'version ' . PMA_VERSION . $crlf
  65.            .  $GLOBALS['comment_marker'] . 'http://www.phpmyadmin.net' . $crlf
  66.            .  $GLOBALS['comment_marker'] . $crlf
  67.            .  $GLOBALS['comment_marker'] . $GLOBALS['strHost'] . ': ' . $cfg['Server']['host'];
  68.     if (!empty($cfg['Server']['port'])) {
  69.          $head .= ':' . $cfg['Server']['port'];
  70.     }
  71.     $head .= $crlf
  72.            .  $GLOBALS['comment_marker'] . $GLOBALS['strGenTime'] . ': ' . PMA_localisedDate() . $crlf
  73.            .  $GLOBALS['comment_marker'] . $GLOBALS['strServerVersion'] . ': ' . substr(PMA_MYSQL_INT_VERSION, 0, 1) . '.' . (int) substr(PMA_MYSQL_INT_VERSION, 1, 2) . '.' . (int) substr(PMA_MYSQL_INT_VERSION, 3) . $crlf
  74.            .  $GLOBALS['comment_marker'] . $GLOBALS['strPHPVersion'] . ': ' . phpversion() . $crlf;
  75.  
  76.     if (isset($GLOBALS['header_comment']) && !empty($GLOBALS['header_comment'])) {
  77.         $lines = explode('\n', $GLOBALS['header_comment']);
  78.         $head .= $GLOBALS['comment_marker'] . $crlf
  79.                . $GLOBALS['comment_marker'] . implode($crlf . $GLOBALS['comment_marker'], $lines) . $crlf
  80.                . $GLOBALS['comment_marker'] . $crlf;
  81.     }
  82.  
  83.     if (isset($GLOBALS['disable_fk'])) {
  84.         $head .=  $crlf . 'SET FOREIGN_KEY_CHECKS=0;' . $crlf;
  85.     }
  86.  
  87.     if (isset($GLOBALS['use_transaction'])) {
  88.         $head .=  $crlf .'SET AUTOCOMMIT=0;' . $crlf
  89.                 . 'START TRANSACTION;' . $crlf . $crlf;
  90.     }
  91.  
  92.     return PMA_exportOutputHandler($head);
  93. }
  94.  
  95. /**
  96.  * Outputs create database database
  97.  *
  98.  * @param   string      Database name
  99.  *
  100.  * @return  bool        Whether it suceeded
  101.  *
  102.  * @access  public
  103.  */
  104. function PMA_exportDBCreate($db) {
  105.     global $crlf;
  106.     if (isset($GLOBALS['drop_database'])) {
  107.         if (!PMA_exportOutputHandler('DROP DATABASE ' . (isset($GLOBALS['use_backquotes']) ? PMA_backquote($db) : $db) . ';' . $crlf)) return FALSE;
  108.     }
  109.     $create_query = 'CREATE DATABASE ' . (isset($GLOBALS['use_backquotes']) ? PMA_backquote($db) : $db);
  110.     if (PMA_MYSQL_INT_VERSION >= 40101) {
  111.         $collation = PMA_getDbCollation($db);
  112.         if (strpos($collation, '_')) {
  113.             $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
  114.         } else {
  115.             $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
  116.         }
  117.     }
  118.     $create_query .= ';' . $crlf;
  119.     if (!PMA_exportOutputHandler($create_query)) return FALSE;
  120.     return PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
  121. }
  122.  
  123. /**
  124.  * Outputs database header
  125.  *
  126.  * @param   string      Database name
  127.  *
  128.  * @return  bool        Whether it suceeded
  129.  *
  130.  * @access  public
  131.  */
  132. function PMA_exportDBHeader($db) {
  133.     global $crlf;
  134.     $head = $GLOBALS['comment_marker'] . $crlf
  135.           . $GLOBALS['comment_marker'] . $GLOBALS['strDatabase'] . ': ' . (isset($GLOBALS['use_backquotes']) ? PMA_backquote($db) : '\'' . $db . '\''). $crlf
  136.           . $GLOBALS['comment_marker'] . $crlf;
  137.     return PMA_exportOutputHandler($head);
  138. }
  139.  
  140. /**
  141.  * Outputs database footer
  142.  *
  143.  * @param   string      Database name
  144.  *
  145.  * @return  bool        Whether it suceeded
  146.  *
  147.  * @access  public
  148.  */
  149. function PMA_exportDBFooter($db) {
  150.     $result = TRUE;
  151.     if (isset($GLOBALS['sql_constraints'])) {
  152.         $result = PMA_exportOutputHandler($GLOBALS['sql_constraints']);
  153.         unset($GLOBALS['sql_constraints']);
  154.     }
  155.     return $result;
  156. }
  157.  
  158. /**
  159.  * Returns $table's CREATE definition
  160.  *
  161.  * @param   string   the database name
  162.  * @param   string   the table name
  163.  * @param   string   the end of line sequence
  164.  * @param   string   the url to go back in case of error
  165.  * @param   boolean  whether to include creation/update/check dates
  166.  *
  167.  * @return  string   resulting schema
  168.  *
  169.  * @global  boolean  whether to add 'drop' statements or not
  170.  * @global  boolean  whether to use backquotes to allow the use of special
  171.  *                   characters in database, table and fields names or not
  172.  *
  173.  * @access  public
  174.  */
  175. function PMA_getTableDef($db, $table, $crlf, $error_url, $show_dates = false)
  176. {
  177.     global $drop;
  178.     global $use_backquotes;
  179.     global $cfgRelation;
  180.     global $sql_constraints;
  181.  
  182.     $schema_create = '';
  183.     $auto_increment = '';
  184.     $new_crlf = $crlf;
  185.  
  186.     // need to use PMA_DBI_QUERY_STORE with PMA_DBI_num_rows() in mysqli
  187.     $result = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote($db) . ' LIKE \'' . PMA_sqlAddslashes($table) . '\'', NULL, PMA_DBI_QUERY_STORE);
  188.     if ($result != FALSE) {
  189.         if (PMA_DBI_num_rows($result) > 0) {
  190.             $tmpres        = PMA_DBI_fetch_assoc($result);
  191.             if (isset($GLOBALS['auto_increment']) && !empty($tmpres['Auto_increment'])) {
  192.                 $auto_increment .= ' AUTO_INCREMENT=' . $tmpres['Auto_increment'] . ' ';
  193.             }
  194.  
  195.             if ($show_dates && isset($tmpres['Create_time']) && !empty($tmpres['Create_time'])) {
  196.                 $schema_create .= $GLOBALS['comment_marker'] . $GLOBALS['strStatCreateTime'] . ': ' . PMA_localisedDate(strtotime($tmpres['Create_time'])) . $crlf;
  197.                 $new_crlf = $GLOBALS['comment_marker'] . $crlf . $crlf;
  198.             }
  199.  
  200.             if ($show_dates && isset($tmpres['Update_time']) && !empty($tmpres['Update_time'])) {
  201.                 $schema_create .= $GLOBALS['comment_marker'] . $GLOBALS['strStatUpdateTime'] . ': ' . PMA_localisedDate(strtotime($tmpres['Update_time'])) . $crlf;
  202.                 $new_crlf = $GLOBALS['comment_marker'] . $crlf . $crlf;
  203.             }
  204.  
  205.             if ($show_dates && isset($tmpres['Check_time']) && !empty($tmpres['Check_time'])) {
  206.                 $schema_create .= $GLOBALS['comment_marker'] . $GLOBALS['strStatCheckTime'] . ': ' . PMA_localisedDate(strtotime($tmpres['Check_time'])) . $crlf;
  207.                 $new_crlf = $GLOBALS['comment_marker'] . $crlf . $crlf;
  208.             }
  209.         }
  210.         PMA_DBI_free_result($result);
  211.     }
  212.  
  213.     $schema_create .= $new_crlf;
  214.  
  215.     if (!empty($drop)) {
  216.         $schema_create .= 'DROP TABLE IF EXISTS ' . PMA_backquote($table, $use_backquotes) . ';' . $crlf;
  217.     }
  218.  
  219.     // Steve Alberty's patch for complete table dump,
  220.     // Whether to quote table and fields names or not
  221.     if ($use_backquotes) {
  222.         PMA_DBI_query('SET SQL_QUOTE_SHOW_CREATE = 1');
  223.     } else {
  224.         PMA_DBI_query('SET SQL_QUOTE_SHOW_CREATE = 0');
  225.     }
  226.  
  227.     $result = PMA_DBI_query('SHOW CREATE TABLE ' . PMA_backquote($db) . '.' . PMA_backquote($table), NULL, PMA_DBI_QUERY_UNBUFFERED);
  228.     if ($result != FALSE && ($row = PMA_DBI_fetch_row($result))) {
  229.         $create_query = $row[1];
  230.         unset($row);
  231.  
  232.         // Convert end of line chars to one that we want (note that MySQL doesn't return query it will accept in all cases)
  233.         if (strpos($create_query, "(\r\n ")) {
  234.             $create_query = str_replace("\r\n", $crlf, $create_query);
  235.         } elseif (strpos($create_query, "(\n ")) {
  236.             $create_query = str_replace("\n", $crlf, $create_query);
  237.         } elseif (strpos($create_query, "(\r ")) {
  238.             $create_query = str_replace("\r", $crlf, $create_query);
  239.         }
  240.  
  241.         // Should we use IF NOT EXISTS?
  242.         if (isset($GLOBALS['if_not_exists'])) {
  243.             $create_query     = preg_replace('/^CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $create_query);
  244.         }
  245.  
  246.         // are there any constraints to cut out?
  247.         if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $create_query)) {
  248.  
  249.             // Split the query into lines, so we can easily handle it. We know lines are separated by $crlf (done few lines above).
  250.             $sql_lines = explode($crlf, $create_query);
  251.             $sql_count = count($sql_lines);
  252.  
  253.             // lets find first line with constraints
  254.             for ($i = 0; $i < $sql_count; $i++) {
  255.                 if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $sql_lines[$i])) break;
  256.             }
  257.  
  258.             // remove , from the end of create statement
  259.             $sql_lines[$i - 1] = preg_replace('@,$@', '', $sql_lines[$i - 1]);
  260.  
  261.             // prepare variable for constraints
  262.             if (!isset($sql_constraints)) {
  263.                 if (isset($GLOBALS['no_constraints_comments'])) {
  264.                     $sql_constraints = '';
  265.                 } else {
  266.                     $sql_constraints = $crlf . $GLOBALS['comment_marker'] .
  267.                                        $crlf . $GLOBALS['comment_marker'] . $GLOBALS['strConstraintsForDumped'] .
  268.                                        $crlf . $GLOBALS['comment_marker'] . $crlf;
  269.                 }
  270.             }
  271.  
  272.             // comments for current table
  273.             if (!isset($GLOBALS['no_constraints_comments'])) {
  274.                 $sql_constraints .= $crlf . $GLOBALS['comment_marker'] .
  275.                                     $crlf . $GLOBALS['comment_marker'] . $GLOBALS['strConstraintsForTable'] . ' ' . PMA_backquote($table) .
  276.                                     $crlf . $GLOBALS['comment_marker'] . $crlf;
  277.             }
  278.  
  279.             // let's do the work
  280.             $sql_constraints .= 'ALTER TABLE ' . PMA_backquote($table) . $crlf;
  281.  
  282.             $first = TRUE;
  283.             for($j = $i; $j < $sql_count; $j++) {
  284.                 if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $sql_lines[$j])) {
  285.                     if (!$first) {
  286.                         $sql_constraints .= $crlf;
  287.                     }
  288.                     if (strpos($sql_lines[$j], 'CONSTRAINT') === FALSE) {
  289.                         $sql_constraints .= preg_replace('/(FOREIGN[\s]+KEY)/', 'ADD \1', $sql_lines[$j]);
  290.                     } else {
  291.                         $sql_constraints .= preg_replace('/(CONSTRAINT)/', 'ADD \1', $sql_lines[$j]);
  292.                     }
  293.                     $first = FALSE;
  294.                 } else {
  295.                     break;
  296.                 }
  297.             }
  298.             $sql_constraints .= ';' . $crlf;
  299.             $create_query = implode($crlf, array_slice($sql_lines, 0, $i)) . $crlf . implode($crlf, array_slice($sql_lines, $j, $sql_count - 1));
  300.             unset($sql_lines);
  301.         }
  302.         $schema_create .= $create_query;
  303.     }
  304.  
  305.     $schema_create .= $auto_increment;
  306.  
  307.     PMA_DBI_free_result($result);
  308.     return $schema_create;
  309. } // end of the 'PMA_getTableDef()' function
  310.  
  311.  
  312. /**
  313.  * Returns $table's comments, relations etc.
  314.  *
  315.  * @param   string   the database name
  316.  * @param   string   the table name
  317.  * @param   string   the end of line sequence
  318.  * @param   boolean  whether to include relation comments
  319.  * @param   boolean  whether to include column comments
  320.  * @param   boolean  whether to include mime comments
  321.  *
  322.  * @return  string   resulting comments
  323.  *
  324.  * @access  public
  325.  */
  326. function PMA_getTableComments($db, $table, $crlf, $do_relation = false, $do_comments = false, $do_mime = false)
  327. {
  328.     global $cfgRelation;
  329.     global $use_backquotes;
  330.     global $sql_constraints;
  331.  
  332.     $schema_create = '';
  333.  
  334.     // triggered only for MySQL < 4.1.x (pmadb-style comments)
  335.     if ($do_comments && $cfgRelation['commwork']) {
  336.         if (!($comments_map = PMA_getComments($db, $table))) {
  337.             unset($comments_map);
  338.         }
  339.     }
  340.  
  341.     // Check if we can use Relations (Mike Beck)
  342.     if ($do_relation && !empty($cfgRelation['relation'])) {
  343.         // Find which tables are related with the current one and write it in
  344.         // an array
  345.         $res_rel = PMA_getForeigners($db, $table);
  346.  
  347.         if ($res_rel && count($res_rel) > 0) {
  348.             $have_rel = TRUE;
  349.         } else {
  350.             $have_rel = FALSE;
  351.         }
  352.     }
  353.     else {
  354.            $have_rel = FALSE;
  355.     } // end if
  356.  
  357.     if ($do_mime && $cfgRelation['mimework']) {
  358.         if (!($mime_map = PMA_getMIME($db, $table, true))) unset($mime_map);
  359.     }
  360.  
  361.     if (isset($comments_map) && count($comments_map) > 0) {
  362.         $schema_create .= $crlf . $GLOBALS['comment_marker'] . $crlf
  363.                        . $GLOBALS['comment_marker'] . $GLOBALS['strCommentsForTable']. ' ' . PMA_backquote($table, $use_backquotes) . ':' . $crlf;
  364.         foreach ($comments_map AS $comment_field => $comment) {
  365.             $schema_create .= $GLOBALS['comment_marker'] . '  ' . PMA_backquote($comment_field, $use_backquotes) . $crlf
  366.                             . $GLOBALS['comment_marker'] . '      ' . PMA_backquote($comment, $use_backquotes) . $crlf;
  367.         }
  368.         $schema_create .= $GLOBALS['comment_marker'] . $crlf;
  369.     }
  370.  
  371.     if (isset($mime_map) && count($mime_map) > 0) {
  372.         $schema_create .= $crlf . $GLOBALS['comment_marker'] . $crlf
  373.                        . $GLOBALS['comment_marker'] . $GLOBALS['strMIMETypesForTable']. ' ' . PMA_backquote($table, $use_backquotes) . ':' . $crlf;
  374.         @reset($mime_map);
  375.         foreach ($mime_map AS $mime_field => $mime) {
  376.             $schema_create .= $GLOBALS['comment_marker'] . '  ' . PMA_backquote($mime_field, $use_backquotes) . $crlf
  377.                             . $GLOBALS['comment_marker'] . '      ' . PMA_backquote($mime['mimetype'], $use_backquotes) . $crlf;
  378.         }
  379.         $schema_create .= $GLOBALS['comment_marker'] . $crlf;
  380.     }
  381.  
  382.     if ($have_rel) {
  383.         $schema_create .= $crlf . $GLOBALS['comment_marker'] . $crlf
  384.                        . $GLOBALS['comment_marker'] . $GLOBALS['strRelationsForTable']. ' ' . PMA_backquote($table, $use_backquotes) . ':' . $crlf;
  385.         foreach ($res_rel AS $rel_field => $rel) {
  386.             $schema_create .= $GLOBALS['comment_marker'] . '  ' . PMA_backquote($rel_field, $use_backquotes) . $crlf
  387.                             . $GLOBALS['comment_marker'] . '      ' . PMA_backquote($rel['foreign_table'], $use_backquotes)
  388.                             . ' -> ' . PMA_backquote($rel['foreign_field'], $use_backquotes) . $crlf;
  389.         }
  390.         $schema_create .= $GLOBALS['comment_marker'] . $crlf;
  391.     }
  392.  
  393.     return $schema_create;
  394.  
  395. } // end of the 'PMA_getTableComments()' function
  396.  
  397. /**
  398.  * Outputs table's structure
  399.  *
  400.  * @param   string   the database name
  401.  * @param   string   the table name
  402.  * @param   string   the end of line sequence
  403.  * @param   string   the url to go back in case of error
  404.  * @param   boolean  whether to include relation comments
  405.  * @param   boolean  whether to include column comments
  406.  * @param   boolean  whether to include mime comments
  407.  *
  408.  * @return  bool     Whether it suceeded
  409.  *
  410.  * @access  public
  411.  */
  412. function PMA_exportStructure($db, $table, $crlf, $error_url, $relation = FALSE, $comments = FALSE, $mime = FALSE, $dates = FALSE) {
  413.     $formatted_table_name = (isset($GLOBALS['use_backquotes']))
  414.                           ? PMA_backquote($table)
  415.                           : '\'' . $table . '\'';
  416.     $dump = $crlf
  417.           .  $GLOBALS['comment_marker'] . '--------------------------------------------------------' . $crlf
  418.           .  $crlf . $GLOBALS['comment_marker'] . $crlf
  419.           .  $GLOBALS['comment_marker'] . $GLOBALS['strTableStructure'] . ' ' . $formatted_table_name . $crlf
  420.           .  $GLOBALS['comment_marker'] . $crlf
  421.           .  PMA_getTableDef($db, $table, $crlf, $error_url, $dates) . ';' . $crlf
  422.           .  PMA_getTableComments($db, $table, $crlf, $relation, $comments, $mime);
  423.  
  424.  
  425.     return PMA_exportOutputHandler($dump);
  426. }
  427.  
  428. /**
  429.  * Dispatches between the versions of 'getTableContent' to use depending
  430.  * on the php version
  431.  *
  432.  * @param   string      the database name
  433.  * @param   string      the table name
  434.  * @param   string      the end of line sequence
  435.  * @param   string      the url to go back in case of error
  436.  * @param   string      SQL query for obtaining data
  437.  *
  438.  * @return  bool        Whether it suceeded
  439.  *
  440.  * @global  boolean  whether to use backquotes to allow the use of special
  441.  *                   characters in database, table and fields names or not
  442.  * @global  integer  the number of records
  443.  * @global  integer  the current record position
  444.  *
  445.  * @access  public
  446.  *
  447.  * @see     PMA_getTableContentFast(), PMA_getTableContentOld()
  448.  *
  449.  * @author  staybyte
  450.  */
  451. function PMA_exportData($db, $table, $crlf, $error_url, $sql_query)
  452. {
  453.     global $use_backquotes;
  454.     global $rows_cnt;
  455.     global $current_row;
  456.  
  457.     $formatted_table_name = (isset($GLOBALS['use_backquotes']))
  458.                           ? PMA_backquote($table)
  459.                           : '\'' . $table . '\'';
  460.     $head = $crlf
  461.           . $GLOBALS['comment_marker'] . $crlf
  462.           . $GLOBALS['comment_marker'] . $GLOBALS['strDumpingData'] . ' ' . $formatted_table_name . $crlf
  463.           . $GLOBALS['comment_marker'] . $crlf .$crlf;
  464.  
  465.     if (!PMA_exportOutputHandler($head)) return FALSE;
  466.  
  467.     $buffer = '';
  468.  
  469.     // analyze the query to get the true column names, not the aliases
  470.     // (this fixes an undefined index, also if Complete inserts
  471.     //  are used, we did not get the true column name in case of aliases)
  472.     $analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($sql_query));
  473.  
  474.     $result      = PMA_DBI_query($sql_query, NULL, PMA_DBI_QUERY_UNBUFFERED);
  475.     if ($result != FALSE) {
  476.         $fields_cnt     = PMA_DBI_num_fields($result);
  477.  
  478.         // Get field information
  479.         $fields_meta    = PMA_DBI_get_fields_meta($result);
  480.         $field_flags    = array();
  481.         for ($j = 0; $j < $fields_cnt; $j++) {
  482.             $field_flags[$j] = PMA_DBI_field_flags($result, $j);
  483.         }
  484.  
  485.         for ($j = 0; $j < $fields_cnt; $j++) {
  486.             if (isset($analyzed_sql[0]['select_expr'][$j]['column'])) {
  487.                 $field_set[$j] = PMA_backquote($analyzed_sql[0]['select_expr'][$j]['column'], $use_backquotes);
  488.             } else {
  489.                 $field_set[$j] = PMA_backquote($fields_meta[$j]->name, $use_backquotes);
  490.             }
  491.         }
  492.  
  493.         if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'update') {
  494.             // update
  495.             $schema_insert  = 'UPDATE ';
  496.             if (isset($GLOBALS['sql_ignore']))
  497.                 $schema_insert .= 'IGNORE ';
  498.             $schema_insert .= PMA_backquote($table, $use_backquotes) . ' SET ';
  499.         } else {
  500.             // insert or replace
  501.             if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'replace') {
  502.                 $sql_command    = 'REPLACE';
  503.             } else {
  504.                 $sql_command    = 'INSERT';
  505.             }
  506.  
  507.             // delayed inserts?
  508.             if (isset($GLOBALS['delayed'])) {
  509.                 $insert_delayed = ' DELAYED';
  510.             } else {
  511.                 $insert_delayed = '';
  512.             }
  513.  
  514.             // insert ignore?
  515.             if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'insert' && isset($GLOBALS['sql_ignore'])) {
  516.                 $insert_delayed .= ' IGNORE';
  517.             }
  518.  
  519.             // scheme for inserting fields
  520.             if (isset($GLOBALS['showcolumns'])) {
  521.                 $fields        = implode(', ', $field_set);
  522.                 $schema_insert = $sql_command . $insert_delayed .' INTO ' . PMA_backquote($table, $use_backquotes)
  523.                                . ' (' . $fields . ') VALUES (';
  524.             } else {
  525.                 $schema_insert = $sql_command . $insert_delayed .' INTO ' . PMA_backquote($table, $use_backquotes)
  526.                                . ' VALUES (';
  527.             }
  528.         }
  529.  
  530.         $search       = array("\x00", "\x0a", "\x0d", "\x1a"); //\x08\\x09, not required
  531.         $replace      = array('\0', '\n', '\r', '\Z');
  532.         $current_row  = 0;
  533.         $separator    = isset($GLOBALS['extended_ins']) ? ',' : ';';
  534.  
  535.         while ($row = PMA_DBI_fetch_row($result)) {
  536.             $current_row++;
  537.             for ($j = 0; $j < $fields_cnt; $j++) {
  538.                 // NULL
  539.                 if (!isset($row[$j]) || is_null($row[$j])) {
  540.                     $values[]     = 'NULL';
  541.                 // a number
  542.                 // timestamp is numeric on some MySQL 4.1
  543.                 } elseif ($fields_meta[$j]->numeric && $fields_meta[$j]->type != 'timestamp') {
  544.                     $values[] = $row[$j];
  545.                 // a binary field
  546.                 // Note: with mysqli, under MySQL 4.1.3, we get the flag
  547.                 // "binary" for those field types (I don't know why)
  548.                 } else if (stristr($field_flags[$j], 'BINARY')
  549.                         && isset($GLOBALS['hexforbinary'])
  550.                         && $fields_meta[$j]->type != 'datetime'
  551.                         && $fields_meta[$j]->type != 'date'
  552.                         && $fields_meta[$j]->type != 'time'
  553.                         && $fields_meta[$j]->type != 'timestamp'
  554.                        ) {
  555.                     // empty blobs need to be different, but '0' is also empty :-(
  556.                     if (empty($row[$j]) && $row[$j] != '0') {
  557.                         $values[] = '\'\'';
  558.                     } else {
  559.                         $values[] = '0x' . bin2hex($row[$j]);
  560.                     }
  561.                 // something else -> treat as a string
  562.                 } else {
  563.                     $values[] = '\'' . str_replace($search, $replace, PMA_sqlAddslashes($row[$j])) . '\'';
  564.                 } // end if
  565.             } // end for
  566.  
  567.             // should we make update?
  568.             if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'update') {
  569.  
  570.                 $insert_line = $schema_insert;
  571.                 for ($i = 0; $i < $fields_cnt; $i++) {
  572.                     if ($i > 0) {
  573.                         $insert_line .= ', ';
  574.                     }
  575.                     $insert_line .= $field_set[$i] . ' = ' . $values[$i];
  576.                 }
  577.  
  578.                 $insert_line .= ' WHERE ' . PMA_getUvaCondition($result, $fields_cnt, $fields_meta, $row);
  579.  
  580.             } else {
  581.  
  582.                 // Extended inserts case
  583.                 if (isset($GLOBALS['extended_ins'])) {
  584.                     if ($current_row == 1) {
  585.                         $insert_line  = $schema_insert . implode(', ', $values) . ')';
  586.                     } else {
  587.                         $insert_line  = '(' . implode(', ', $values) . ')';
  588.                     }
  589.                 }
  590.                 // Other inserts case
  591.                 else {
  592.                     $insert_line      = $schema_insert . implode(', ', $values) . ')';
  593.                 }
  594.             }
  595.             unset($values);
  596.  
  597.             if (!PMA_exportOutputHandler(($current_row == 1 ? '' : $separator . $crlf) . $insert_line)) return FALSE;
  598.  
  599.         } // end while
  600.         if ($current_row > 0) {
  601.             if (!PMA_exportOutputHandler(';' . $crlf)) return FALSE;
  602.         }
  603.     } // end if ($result != FALSE)
  604.     PMA_DBI_free_result($result);
  605.  
  606.     return TRUE;
  607. } // end of the 'PMA_exportData()' function
  608. ?>
  609.